#include "smart_pcie_ep.hpp"
#include <cstring>
#include <unistd.h>

SmartPcieEp::SmartPcieEp() {}
SmartPcieEp::~SmartPcieEp() {}

int SmartPcieEp::init()
{
    int ret = rk_pcie_device_init();
    if (ret != 0) {
        log_error("pcie init device error!");
        return;
    }

    ret = rk_pcie_ap_init();  //如果rc端未初始化，该函数会阻塞
    if (ret != 0) {
        log_error("pcie init ap error!");
        return;
    }

    // size_t buffer_size;
    // buffer_size = rk_pcie_get_buff_max_size(E_SEND);
    // m_send_data.resize(buffer_size);
    // buffer_size = rk_pcie_get_buff_max_size(E_RECV);
    // m_recv_data.resize(buffer_size);
    // log_info("rk-pcie start max buffer_size = %ld" , buffer_size);

    log_debug("Pcie ep init!");
}

int SmartPcieEp::deinit()
{
    rk_pcie_ap_deinit();
    rk_pcie_device_deinit();
    log_debug("Pcie ep exit!");
}

int SmartPcieEp::stop()
{
    m_loop_run = false;
}

int SmartPcieEp::send(std::vector<uint8_t> data)
{
    struct pcie_buff_node* node;

    m_loop_run = true;
    do {
        node = rk_pcie_get_buff(E_SEND);
        if (node) {
            memcpy(node->vir_addr, data.data(), data.size());
            rk_pcie_send_buff(node);
        } else {
            usleep(1000);
        }
    } while (node == nullptr && m_loop_run == true);

    return 0;
}

int SmartPcieEp::recv(std::vector<uint8_t> date)
{

}
